// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.

// Author: Shuo Chen (chenshuo at chenshuo dot com)
//
// This is an internal header file, you should not include this.

#ifndef MUDUO_NET_SOCKETSOPS_H
#define MUDUO_NET_SOCKETSOPS_H

#include <arpa/inet.h>

namespace muduo
{
	namespace net
	{
		namespace sockets
		{

			///
			/// Creates a non-blocking socket file descriptor,
			/// abort if any error.
			int createNonblockingOrDie( sa_family_t family );

			int  connect( int sockfd, const struct sockaddr* addr );
			void bindOrDie( int sockfd, const struct sockaddr* addr );
			void listenOrDie( int sockfd );
			int  accept( int sockfd, struct sockaddr_in6* addr );
			ssize_t read( int sockfd, void *buf, size_t count );
			ssize_t readv( int sockfd, const struct iovec *iov, int iovcnt );
			ssize_t write( int sockfd, const void *buf, size_t count );
			void close( int sockfd );
			void shutdownWrite( int sockfd );

			void toIpPort( char* buf, size_t size,
				const struct sockaddr* addr );
			void toIp( char* buf, size_t size,
				const struct sockaddr* addr );

			void fromIpPort( const char* ip, uint16_t port,
				struct sockaddr_in* addr );
			void fromIpPort( const char* ip, uint16_t port,
				struct sockaddr_in6* addr );

			int getSocketError( int sockfd );

			const struct sockaddr* sockaddr_cast( const struct sockaddr_in* addr );
			const struct sockaddr* sockaddr_cast( const struct sockaddr_in6* addr );
			struct sockaddr* sockaddr_cast( struct sockaddr_in6* addr );
			const struct sockaddr_in* sockaddr_in_cast( const struct sockaddr* addr );
			const struct sockaddr_in6* sockaddr_in6_cast( const struct sockaddr* addr );

			struct sockaddr_in6 getLocalAddr( int sockfd );
			struct sockaddr_in6 getPeerAddr( int sockfd );
			bool isSelfConnect( int sockfd );

		}
	}
}

#endif  // MUDUO_NET_SOCKETSOPS_H
